home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / PERL / Perl / Lib / Look < prev    next >
Text File  |  1990-06-12  |  895b  |  43 lines

  1. ;# Usage: &look(*FILEHANDLE,$key,$dict,$fold)
  2.  
  3. ;# Sets file position in FILEHANDLE to be first line greater than or equal
  4. ;# (stringwise) to $key.  Pass flags for dictionary order and case folding.
  5.  
  6. sub look {
  7.     local(*FH,$key,$fold) = @_;
  8.     local($max,$min,$mid,$_);
  9.     local($blksize) = 8192;
  10.     $key =~ s/[^\w\s]//g if $dict;
  11.     $key =~ y/A-Z/a-z/ if $fold;
  12.     $max = int($size / $blksize);
  13.     while ($max - $min > 1) {
  14.     $mid = int(($max + $min) / 2);
  15.     seek(FH,$mid * $blksize,0);
  16.     $_ = <FH> if $mid;        # probably a partial line
  17.     $_ = <FH>;
  18.     chop;
  19.     s/[^\w\s]//g if $dict;
  20.     y/A-Z/a-z/ if $fold;
  21.     if ($_ lt $key) {
  22.         $min = $mid;
  23.     }
  24.     else {
  25.         $max = $mid;
  26.     }
  27.     }
  28.     $min *= $blksize;
  29.     seek(FH,$min,0);
  30.     <FH> if $min;
  31.     while (<FH>) {
  32.     chop;
  33.     s/[^\w\s]//g if $dict;
  34.     y/A-Z/a-z/ if $fold;
  35.     last if $_ ge $key;
  36.     $min = tell(FH);
  37.     }
  38.     seek(FH,$min,0);
  39.     $min;
  40. }
  41.  
  42. 1;
  43.